package concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by yangyang on 2017/5/17 22:56.
 */
public class AtomicityTest implements Runnable{
    private int i = 0;
    public int getValue() {
        return i;
    }
    private synchronized void evenIncrement() {
        i++;
        i++;
    }
    @Override
    public void run() {
        while (true) {
            evenIncrement();
        }
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        AtomicityTest test = new AtomicityTest();
        executorService.execute(test);
//        executorService.execute(test);
        while (true) {
            int value = test.getValue();
            if (value % 2 != 0) {
                System.out.println(value);
                System.exit(0);
            }
        }
    }
}
/**
 * 该程序存在的问题：
 *  1.  evenIncrement()是synchronized，保证可以增长两次；
 *      但是getValue()不是，所以仍然可能获取奇数value(尽管return i是原子性操作)
 *  2.  i不是volatile的，存在可视性问题
 *      注：Thinking in java认为存在可视性问题，我一开始认为i是局部变量，不存在可视性问题，
 *      但后来仔细思考，还是存在的，毕竟executorService.execute(test)可以执行多次
 *      还需继续了解
 */